package edu.random;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

public class Randonizador implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private List<Randonizable> list = new ArrayList<Randonizable>();
	
	public boolean add(Randonizable r){
		return list.add(r);
	}
	public boolean add(List<Randonizable> listRandonizable){
		return list.addAll(listRandonizable);
	}
	
	@SuppressWarnings("unchecked")
	public Randonizable getRandom(Randonizable r){
		List<Randonizable> listCloned = (List<Randonizable>) ((ArrayList<Randonizable>) list).clone();
		listCloned.remove(r);
		return this.getRandom(listCloned);
	}
	
	public Randonizable getRandom(){
		return this.getRandom(list);
	}
	
	private Randonizable getRandom(List<Randonizable> list){
		long total = Randonizador.total(list);
		
		long inicial = 1;
		long numRandom = 1 + (long) (Math.random() * total);
		
		for (Randonizable random : list ){
			long rate = random.getRate();
			if (numRandom >= inicial && numRandom < (rate + inicial - 1)){
				return random;
			}
			inicial += rate;
		}
		numRandom = (long) (Math.random() * list.size());
		return list.get((int) numRandom);
	}
	
	private static long total(List<Randonizable> list){
		long total = 0;
		for (Randonizable random : list ){
			total += random.getRate();
		}
		return total;
	}
	public Randonizable getMax(){		
		Randonizable max = list.get(0);
		for (Randonizable ram : list){
			try {
				if (max != null && max.getRate() > ram.getRate()){
					max = ram;
				}
			} catch (Exception e) {}
		}
		return max;
	}
	public List<Randonizable> getAll(){
		return list;
	}
}
